package com.ethan.ms.plugin.robot;

import tools.json.JSONObject;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Map;

public interface IRobotRMI extends Remote {

    /**
     * 全区发送消息
     * 参数对应MapleCharacter#dropMessage
     *
     * @param type 消息种类
     * @param msg  消息文本
     * @return 是否操作成功
     */
    boolean serverMessage(int type, String msg) throws RemoteException;

    /**
     * 全区发送消息
     * 参数对应MapleCharacter#dropSpouseMessage
     *
     * @param type 消息种类
     * @param msg  消息文本
     * @return 是否操作成功
     */
    boolean serverSpouseMessage(int type, String msg) throws RemoteException;

    /**
     * 通过角色名封禁指定角色
     *
     * @param playerName 角色名
     * @return 是否操作成功
     */
    boolean ban(String playerName) throws RemoteException;

    /**
     * 给所有在线角色发放道具
     *
     * @param items itemId->count的键值对 itemId:0=金币,1=点券,2=抵用券,3=经验
     * @return 是否操作成功
     */
    boolean sendItemToAllOnlinePlayers(Map<Integer, Integer> items) throws RemoteException;

    /**
     * 给指定地图在线角色发放道具
     *
     * @param mapId 地图ID
     * @param items itemId->count的键值对
     * @return 是否操作成功
     */
    boolean sendItemToMap(int mapId, Map<Integer, Integer> items) throws RemoteException;

    /**
     * 给指定角色发放道具
     *
     * @param playerName 角色名
     * @param items      itemId->count的键值对
     * @return 是否操作成功
     */
    boolean sendItemToPlayer(String playerName, Map<Integer, Integer> items) throws RemoteException;

    /**
     * 断开某角色的连接
     *
     * @param playerName 角色名
     * @return 是否操作成功
     */
    boolean disconnectPlayer(String playerName) throws RemoteException;

    /**
     * 给指定角色增加人气
     *
     * @param playerName 角色名
     * @param fame       人气度
     * @return 是否操作成功
     */
    boolean addFame(String playerName, int fame) throws RemoteException;

    /**
     * 设置倍率
     *
     * @param type 类型1经验2爆率3金币
     * @param rate 倍率
     * @return 是否操作成功
     */
    boolean changeRate(int type, int rate) throws RemoteException;

    /**
     * 取所有在线角色信息
     *
     * @return 在线角色
     */
    List<JSONObject> getOnlinePlayers() throws RemoteException;

    /**
     * 将某个角色传送到目标地图
     *
     * @param playerName 角色名
     * @param distMapId  目标地图ID
     * @return 是否操作成功
     */
    boolean transferPlayer(String playerName, int distMapId) throws RemoteException;

    /**
     * 执行数据库SQL语句，插入数据用
     *
     * @param sql    sql语句
     * @param params 参数
     * @return 是否操作成功
     */
    boolean customSqlInsert(String sql, Object... params) throws RemoteException;

    /**
     * 执行数据库SQL语句，更新数据用
     *
     * @param sql    sql语句
     * @param params 参数
     */
    int customSqlUpdate(String sql, Object... params) throws RemoteException;

    /**
     * 执行数据库SQL语句，查询数据用
     *
     * @param sql    sql语句
     * @param params 参数
     * @return 查询结果
     */
    List<Map<String, Object>> customSqlResult(String sql, Object... params) throws RemoteException;

    /**
     * 执行服务端js脚本
     *
     * @param playerName   要执行脚本的角色名，如果为null，则脚本不能调用getPlayer()，否则报错
     * @param scriptName   脚本名
     * @param functionName 脚本函数名
     * @param args         函数参数
     * @return 脚本函数返回的值
     */
    Object invokeScript(String playerName, String scriptName, String functionName, Object... args) throws RemoteException;

    /**
     * 验证账号密码
     *
     * @param account  账号
     * @param password 密码
     * @return 0=验证通过 1=账号不存在 2=密码不正确
     */
    int checkPassword(String account, String password) throws RemoteException;

    /**
     * 注册账号
     *
     * @param account  账号
     * @param password 密码
     * @param qq       qq
     */
    boolean createAccount(String account, String password, long qq) throws RemoteException;
}
